#include "json_functions.h"

// 创建一个简单的JSON对象
char* create_json(const char* key, const char* value) {
    // 计算所需的字符串长度
    int len = strlen(key) + strlen(value) + 8; // {"":""}
    char* json = (char*)malloc(len);
    if (json == NULL) {
        return NULL;
    }
    
    sprintf(json, "{\"%s\":\"%s\"}", key, value);
    return json;
}

// 从JSON字符串中解析值
char* parse_json(const char* json_str, const char* key) {
    // 构建要查找的键字符串
    int key_len = strlen(key);
    char* search_key = (char*)malloc(key_len + 4); // "":
    if (search_key == NULL) {
        return NULL;
    }
    sprintf(search_key, "\"%s\":", key);
    
    // 查找键在JSON中的位置
    char* key_pos = strstr(json_str, search_key);
    free(search_key);
    
    if (key_pos == NULL) {
        return NULL;
    }
    
    // 移动到值的开始位置
    char* value_start = strchr(key_pos + key_len + 3, '"'); // 跳过 "key":
    if (value_start == NULL) {
        return NULL;
    }
    value_start++;
    
    // 查找值的结束位置
    char* value_end = strchr(value_start, '"');
    if (value_end == NULL) {
        return NULL;
    }
    
    // 提取值
    int value_len = value_end - value_start;
    char* value = (char*)malloc(value_len + 1);
    if (value == NULL) {
        return NULL;
    }
    strncpy(value, value_start, value_len);
    value[value_len] = '\0';
    
    return value;
}

// 释放JSON字符串内存
void free_json(char* json_str) {
    if (json_str != NULL) {
        free(json_str);
    }
}

// 构建用于Socket发送的JSON消息
char* build_socket_json_message(const char* type, const char* data) {
    // 计算所需的字符串长度
    int len = strlen(type) + strlen(data) + 20; // {"type":"","data":""}
    char* json = (char*)malloc(len);
    if (json == NULL) {
        return NULL;
    }
    
    sprintf(json, "{\"type\":\"%s\",\"data\":\"%s\"}", type, data);
    return json;
}

// 解析从Socket接收到的JSON消息
int parse_socket_json_message(const char* json_str, char** type, char** data) {
    *type = parse_json(json_str, "type");
    *data = parse_json(json_str, "data");
    
    if (*type == NULL || *data == NULL) {
        if (*type != NULL) {
            free(*type);
            *type = NULL;
        }
        if (*data != NULL) {
            free(*data);
            *data = NULL;
        }
        return -1;
    }
    
    return 0;
}